import axios from 'axios'

// 导入 element 中的提示框
import { Message } from 'element-ui'
import { getToken, getTimeStamp } from '@/utils/auth'
// 导入 store
import store from '@/store'
// 导入 router
import router from '@/router'

// 创建 axios 的副本
const instance = axios.create({
  baseURL: '/api'
})
// 定义一个过期时间
const time = 30 * 60 * 1000 // 过期进行为 30 分钟
// const time = 5000

// 设置拦截器
// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 得到 token
    const token = getToken() // 从 cookie 中获取
    if (token) {
      // 得到当前时间
      const cureentTime = Date.now()
      // 再得到保存 token 的时间
      const tokenTime = getTimeStamp()
      // 得到两者的时间差
      const space = cureentTime - tokenTime
      // 判断 token 是否过期：
      if (space >= time) {
        // 说明超时
        // 清除 token
        store.dispatch('user/logout')
        // 提示
        Message.info('token 超时，请重新登录')
        // 跳转到登录页面
        router.push(`/login?_redirect=${window.location.href.split('#')[1]}`)
        return Promise.reject(new Error('token 超时'))
      }
      // 将 token 设置到请求头中
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器
// instance.interceptors.response.use(response => {}, error () {})
//  第一回调：处理返回状态为 2xx 的逻辑
//  第二回调：处理非 2xx 的逻辑
instance.interceptors.response.use(
  response => {
    const {
      data: { success, message }
    } = response
    // 判断当前请求的结果是否为 true
    if (success) {
      // 返回数据时，直接返回服务器响应的内容
      return response.data
    } else {
      // 提示错误信息
      Message.error(message)
      return Promise.reject(new Error(message))
    }
  },
  error => {
    console.dir(error)
    // 判断返回的状态
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // 说明 token 超时，
      // 删除 token,
      store.dispatch('user/logout')
      // 提示
      Message.info('登录超时，请重新登录')
      // 退出登录
      router.push(`/login?_redirect=${window.location.href.split('#')[1]}`)
    }
    return Promise.reject(error)
  }
)

// 暴露对象
export default instance
